home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-03-05 | 6.2 KB | 221 lines | [TEXT/MMCC] |
- //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
- //
- // FadeGDev.c
- //
- // Code to fade a GDevice from and to black
- //
- // History:
- //
- // 950305 jb: Compiled
- //
- //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
-
-
- // __#Defines________________________________________________________________________
- #define kMaxPaletteSize 0xFF
-
- // __#Headers________________________________________________________________________
- #include "Utils.h"
- #include "FadeGDev.h"
-
- // __#Protos_________________________________________________________________________
- // __ Macros_________________________________________________________________________
- // __ Enums__________________________________________________________________________
- // __ Typedefs_______________________________________________________________________
- typedef struct {
- short reds [ kMaxPaletteSize ];
- short greens [ kMaxPaletteSize ];
- short blues [ kMaxPaletteSize ];
- } FadeValues;
-
- // __ Static Protos__________________________________________________________________
- static void FadeOutDevice( short, FadeValues );
- static void FadeInDevice( short, FadeValues );
- static void BlackoutDeviceClut( void );
-
- // __ Extern Globals_________________________________________________________________
- // __ Static Globals_________________________________________________________________
- static CTabHandle pFadeClut; // 'clut' to alter with fading functions
- static CTabHandle pOrigClut; // 'clut' to hold a copy of original
-
- // __ Functions______________________________________________________________________
-
-
-
-
-
- //____ FadeWindowsGDev __________________________________________________________________________
- //
- // Fade the GDevice a window is on. Depending on command passed, you may
- // fade it from or to black
- //
- // Returns void
- //
- void FadeWindowsGDev( WindowPtr theWindow, short speed, etFadeCommand fadeCmd )
- {
- GDHandle theDevice;
- Rect windStructRect;
-
- mAssert( NULL != theWindow );
-
- windStructRect = mWindStructRect( theWindow );
- mAssert(!EmptyRect(&windStructRect));
-
- // What device is this window mostly on?
- theDevice = GetMaxIntersectDevice( windStructRect );
- mAssert( NULL != theDevice );
-
- FadeGDevice( theDevice, speed, fadeCmd );
-
- }//FadeWindowsGDev
-
-
-
- //____ FadeGDevice __________________________________________________________________________
- //
- // Fade the GDevice from or to black.
- //
- // Returns void
- //
- void FadeGDevice( GDHandle screen, short speed, etFadeCommand fadeCmd )
- {
- GDHandle oldDev;
- FadeValues rgbs;
- short index;
-
- // If this device is a Direct device, it can't be faded using
- // this technique.
- if ( ( **screen ).gdType == directType )
- {
- return;
- }
-
- oldDev = GetGDevice();
- SetGDevice( screen );
-
- //copy screen's Color Table
- pFadeClut = ( *(*screen)->gdPMap )->pmTable;
- pOrigClut = ( *(*screen)->gdPMap )->pmTable;
- HandToHand( ( Handle* )&pOrigClut );
-
- HLock( ( Handle )pFadeClut );
- HLock( ( Handle )pOrigClut );
-
- //pre-calculate fade values
- for (index = 0; index < ( *pFadeClut )->ctSize; index++)
- {
- rgbs.reds[index] = (*pFadeClut)->ctTable[index].rgb.red / speed;
- rgbs.greens[index] = (*pFadeClut)->ctTable[index].rgb.green / speed;
- rgbs.blues[index] = (*pFadeClut)->ctTable[index].rgb.blue / speed;
- }
-
- if ( fadeCmd == eFade_FadeOutCommand )
- {
- FadeOutDevice( speed, rgbs );
- }
- else
- {
- FadeInDevice( speed, rgbs );
- }
-
- //restore the clut
- for ( index = 0; index < ( *pFadeClut )->ctSize; index++ )
- {
- (*pFadeClut)->ctTable[index].rgb.red = ( *pOrigClut )->ctTable[index].rgb.red;
- (*pFadeClut)->ctTable[index].rgb.green = ( *pOrigClut )->ctTable[index].rgb.green;
- (*pFadeClut)->ctTable[index].rgb.blue = ( *pOrigClut )->ctTable[index].rgb.blue;
- }
- ( *pFadeClut )->ctSeed = GetCTSeed(); //clut changed, must get new ctSeed
- MakeITable( nil, nil, 0 ); //Create inverse table using GDev's default values
- mAssert( noErr == QDError() );
-
- HUnlock( ( Handle )pFadeClut );
- HUnlock( ( Handle )pOrigClut );
-
- SetGDevice( oldDev );
-
- DisposeHandle( ( Handle )pOrigClut );
-
- }//FadeGDevice
-
-
-
-
- //____ FadeOutDevice __________________________________________________________________________
- //
- // Fade out a device.
- //
- // Returns void
- //
- void FadeOutDevice(short speed, FadeValues rgbs)
- {
- short index, speedIndex;
-
- for ( speedIndex = speed; speedIndex >= 0; speedIndex-- )
- {
- for (index = 0; index < ( *pFadeClut )->ctSize; index++)
- {
- if ((*pFadeClut)->ctTable[index].rgb.red > rgbs.reds[index])
- (*pFadeClut)->ctTable[index].rgb.red -= rgbs.reds[index];
- if ((*pFadeClut)->ctTable[index].rgb.green > rgbs.greens[index])
- (*pFadeClut)->ctTable[index].rgb.green -= rgbs.greens[index];
- if ((*pFadeClut)->ctTable[index].rgb.blue > rgbs.blues[index])
- (*pFadeClut)->ctTable[index].rgb.blue -= rgbs.blues[index];
- }
- SetEntries( 0, ( *pFadeClut )->ctSize - 1, (*pFadeClut)->ctTable );
- }
- BlackoutDeviceClut();
- }
-
-
-
-
- //____ FadeWindow __________________________________________________________________________
- //
- // Fade in a device.
- //
- // Returns void
- //
- void FadeInDevice( short speed, FadeValues rgbs )
- {
- short index, speedIndex;
-
- BlackoutDeviceClut();
-
- for (speedIndex = 0; speedIndex < speed; speedIndex++)
- {
- for (index = 0; index < ( *pFadeClut )->ctSize; index++)
- {
- if ((*pFadeClut)->ctTable[index].rgb.red < (*pOrigClut)->ctTable[index].rgb.red)
- (*pFadeClut)->ctTable[index].rgb.red += rgbs.reds[index];
- if ((*pFadeClut)->ctTable[index].rgb.green < (*pOrigClut)->ctTable[index].rgb.green)
- (*pFadeClut)->ctTable[index].rgb.green += rgbs.greens[index];
- if ((*pFadeClut)->ctTable[index].rgb.blue < (*pOrigClut)->ctTable[index].rgb.blue)
- (*pFadeClut)->ctTable[index].rgb.blue += rgbs.blues[index];
- }
- SetEntries( 0, ( *pFadeClut )->ctSize - 1, ( *pFadeClut )->ctTable );
- }
- }
-
-
-
-
- //____ BlackoutDeviceClut __________________________________________________________________________
- //
- // Black out the device.
- //
- // Returns
- //
- void BlackoutDeviceClut(void)
- {
- short index;
-
- for ( index = 0; index < ( *pFadeClut )->ctSize; index++ )
- {
- ( *pFadeClut )->ctTable[index].rgb.red = 0;
- ( *pFadeClut )->ctTable[index].rgb.green = 0;
- ( *pFadeClut )->ctTable[index].rgb.blue = 0;
- }
- SetEntries( 0, ( *pFadeClut )->ctSize - 1, ( *pFadeClut )->ctTable );
- }
-